package com.example.demo.controller;

import com.example.demo.common.entity.ParamBase;
import com.example.demo.common.entity.ParamPage;
import com.example.demo.common.util.BucnInvoker;
import com.example.demo.common.util.ListResult;
import com.example.demo.common.util.OptResult;
import com.example.demo.service.DbClueInfodxjService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @author ly-dengxiaojiao
 *
 */

@Api(tags = "*商机管理", value = "商机", description = "商机")
@RestController
@RequestMapping("ly/mp/clue/dbClueInfo")
public class DbClueInfodxjController {

	@Autowired
	DbClueInfodxjService dbClueInfoService;

	@ApiOperation("新增或修改商机信息")
	@PostMapping("InsertOrUpdate.do")
	public OptResult InsertOrUpdate(@RequestBody ParamBase<Map<String, Object>> paramBase,
									@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		/**
		 * 思路：
		 * （1）根据当前用户登录的token获取到用户ID，根据用户ID查询人员信息表，然后获取到当前用户的所属公司部门科室等信息，将这些信息放到参数对象param
		 * （2）判断是否有主键，有就是更新，没有就是新增；有主键的时候还要看updateControlId是否为空，为空还需要抛出异常信息
		 * （3）有主键的时候，更新商机信息，更新前先调用补充公共字段方法补充公共字段信息，然后修改商机信息；修改同时要删除原商机ID相关的联系人信息，创建一个hashmap用于存放联系人的参数字段，将商机id加入hashmap，然后根据hashmap作为参数对象，然后调用根据商机id删除联系人信息；删除原来联系人信息，给商机ID添加新的联系人，获取param中的linkman对象作为参数对象，然后遍历map，循环添加联系人信息。添加前补充公共字段和ID给随机字符串，将商机id加入map作为参数
		 * （4）没有主键的时候，新增商机信息，验证线索编码是否已经存在，根据线索编码查询有多少条线索，如果返回的数量大于0就说明存在，存在就不能继续往下执行新增商机了，如果数量为0或者小于0，就说明不存在，继续往下补充公共字段，然后新增商机信息，新增商机之后获取到商机ID，同时要给新增的商机添加联系人，获取param对象中的linkman进行新增联系人。
		 */
		return BucnInvoker.doOpt(() -> dbClueInfoService.InsertOrUpdate(paramBase, token));
	}

//	@ResponseExcel(exportDataLocation="root.rows")
	@ApiOperation("获取商机信息（含分页数据）")
	@PostMapping("GetClueList.do")
	public ListResult<Map<String, Object>> GetClueList(@RequestBody ParamPage<Map<String, Object>> paramPage,
													   @RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		/**
		 * 这里collection是使用嵌套查询中的集合的嵌套查询，不是嵌套结果，也不是关联嵌套结果
		 * （1）参数对象parm中的clueId是否为空，如果为空，就说明查询的商机列表，直接调用查询商机列表；
		 * （2）如果参数对象不为空，说明要根据商机ID来查询商机详情，根据商机ID查询商机详情，将结果放到rows集合中，根据商机ID查询联系人详情，将结果放到rows集合中的clueLinkManList集合中，根据商机ID查询跟进历史记录，将结果放到rows集合的followupList集合中。sql写法是先根据商机ID查询商机详情，将结果放到resultMap中，然后使用两个collecton处理联系人和跟进历史记录信息，将商机详情返回的id作为查询联系人和查询跟进历史记录的参数，然后再写两个查询sql。查询跟进历史记录
		 */
		return BucnInvoker.doList(() -> dbClueInfoService.GetClueList(paramPage));

	}

	@ApiOperation("商机跟踪")
	@PostMapping("FollowUpClue.do")
	public OptResult FollowUpClue(@RequestBody ParamBase<Map<String, Object>> paramBase,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doOpt(() -> dbClueInfoService.FollowUpClue(paramBase, token));
	}

	@ApiOperation("获取商机跟踪历史信息")
	@PostMapping("GetClueFollowList.do")
	public ListResult<Map<String, Object>> GetClueFollowList(@RequestBody ParamPage<Map<String, Object>> paramPage,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doList(() -> dbClueInfoService.GetClueFollowList(paramPage));

	}


	@ApiOperation("分配商机")
	@PostMapping("DistClue.do")
	public OptResult DistClue(@RequestBody ParamBase<Map<String, Object>> paramBase,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doOpt(() -> dbClueInfoService.DistClue(paramBase, token));
	}





	@ApiOperation("战败审核线索列表")
	@PostMapping("GetCheckFailClueList.do")
	public ListResult<Map<String, Object>> GetCheckFailClueList(@RequestBody ParamPage<Map<String, Object>> paramPage,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doList(() -> dbClueInfoService.GetCheckFailClueList(paramPage));

	}


	@ApiOperation("战败审核")
	@PostMapping("CheckFailClue.do")
	public OptResult CheckFailClue(@RequestBody ParamBase<Map<String, Object>> paramBase,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doOpt(() -> dbClueInfoService.CheckFailClue(paramBase, token));
	}


	@ApiOperation("删除商机信息")
	@PostMapping("DelClue.do")
	public OptResult DelClue(@RequestBody ParamBase<Map<String, Object>> paramBase,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doOpt(() -> dbClueInfoService.DelClue(paramBase, token));
	}



	@ApiOperation("查询线索来源信息")
	@PostMapping("selectClueSource.do")
	public ListResult<Map<String, Object>> selectClueSource(@RequestBody ParamPage<Map<String, Object>> paramPage,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doList(() -> dbClueInfoService.selectClueSource(paramPage));

	}

	@ApiOperation("查询客户 ")
	@PostMapping("selectCustName.do")
	public ListResult<Map<String, Object>> selectCustName(@RequestBody ParamPage<Map<String, Object>> paramPage,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doList(() -> dbClueInfoService.selectCustName(paramPage));

	}

	@ApiOperation("查询意向产品")
	@PostMapping("selectIntentProduct.do")
	public ListResult<Map<String, Object>> selectIntentProduct(@RequestBody ParamPage<Map<String, Object>> paramPage,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doList(() -> dbClueInfoService.selectIntentProduct(paramPage));

	}

	@ApiOperation("查询意向阶级")
	@PostMapping("selectIntentLevel.do")
	public ListResult<Map<String, Object>> selectIntentLevel(@RequestBody ParamPage<Map<String, Object>> paramPage,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doList(() -> dbClueInfoService.selectIntentLevel(paramPage));

	}


	@ApiOperation("查询商机联系人信息列表")
	@PostMapping("dbClueLinkManInfoPage.do")
	public ListResult<Map<String, Object>> dbClueLinkManInfoPage(@RequestBody ParamPage<Map<String, Object>> paramPage,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doList(() -> dbClueInfoService.dbClueLinkManInfoPage(paramPage));

	}

	@ApiOperation("删除联系人信息")
	@PostMapping("deleteClueLinkManInfo.do")
	public OptResult deleteClueLinkManInfo(@RequestBody ParamBase<Map<String, Object>> paramBase,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doOpt(() -> dbClueInfoService.deleteClueLinkManInfo(paramBase, token));
	}

	@ApiOperation("新增联系人信息")
	@PostMapping("insertClueLinkManInfo.do")
	public OptResult insertClueLinkManInfo(@RequestBody ParamBase<Map<String, Object>> paramBase,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doOpt(() -> dbClueInfoService.insertClueLinkManInfo(paramBase, token));
	}


 	@ApiOperation("查询跟进记录信息列表")
	@PostMapping("dbClueFollowupPage.do")
	public ListResult<Map<String, Object>> dbClueFollowupPage(@RequestBody ParamPage<Map<String, Object>> paramPage,
			@RequestHeader(HttpHeaders.AUTHORIZATION) String token) {
		return BucnInvoker.doList(() -> dbClueInfoService.dbClueFollowupPage(paramPage));

	}

}
